package com.example.concurrent.chapter08;

/**
 * @author Liuqz
 * @date 2018/11/22 20:05
 *
 * 一个完整的线程池应该具备以下元素:
 *
 * 1.任务队列 : 用于缓存提交的任务
 *
 * 2.任务数量管理能力 : 一个线程池必须能很好的管理和控制线程数量,可通过如下三个参数来实现,
 *                   比如创建线程池时初始的线程数量init
 *                      线程池自动扩充时最大的线程数量max
 *                      在线程池空闲时需要释放线程但是也要维护一定数量的活跃数量或者核心数量core
 *                  有了这三个参数,就能够很好地控制线程池中的数量,将其维护在一个合理的范围之内, 三者之间的关系 : init<=core<=max
 *
 * 3.任务拒绝策略 : 如果线程数量已达到上限并且任务队列已满,则需要有相对应的策略来通知任务提交者
 *
 * 4.线程工厂 : 主要用于个性化定制线程,比如将线程设置为守护线程以及设置线程名称等
 *
 * 5.QueueSize : 任务队列只要存放提交Runnable,但是为了防止内存溢出,需要有limit数量对其进行控制
 *
 * 6.Keepedalive时间 : 该时间主要决定线程各个重要参数自动维护的时间间隔.
 */
public interface ThreadPool {

    //提交任务到线程池
    void execute(Runnable runnable);

    //关闭线程池
    void shutdown();

    //获取线程池的初始化大小
    int getInitSize();

    //获取线程池最大的线程数
    int getMaxSize();

    //获取线程池的核心线程数量
    int getCoreSize();

    //获取线程池中用于缓存任务队列的大小
    int getQueueSize();

    //获得线程池中的活跃线程数量
    int getActiveCount();

    //查看线程池是否已经被shutdown
    boolean isShutDown();
}
